package com.cbh.amadeus.client.receiver.tool;

import com.cbh.amadeus.client.domain.MessageRepositoryModel;

import java.util.List;

/**
 * 消息 模型持久器
 * <p>
 * 用以存储已发送成功的消息
 * 用以消息定时重发
 *
 * @author ChenBiHui
 * @date 2025/5/4
 */
public interface MessageRepositoryModelTool {

    /**
     * ID生成器
     *
     * @return 主键
     */
    String sequence();

    /**
     * 持久提交的消息
     *
     * @param model 提交的目标消息
     */
    void commit(MessageRepositoryModel model);

    /**
     * 调整消息状态 不再进入消息重发列表
     *
     * @param tenant    租户
     * @param topic     主题
     * @param messageId 消息ID
     * @param status    状态枚举
     *                  {@link MessageRepositoryModel.MessageRepositoryEnum#RELEASE}
     *                  {@link MessageRepositoryModel.MessageRepositoryEnum#ABANDON}
     */
    void adjust(String tenant, String topic, String messageId, MessageRepositoryModel.MessageRepositoryEnum status);

    /**
     * 拒收消息 记录次数单调递增一次
     *
     * @param tenant    租户
     * @param topic     主题
     * @param messageId 消息ID
     */
    void reject(String tenant, String topic, String messageId);

    /**
     * 待重发的消息清单
     *
     * @param limit  消息自动重发时, 每次检索活跃消息的条数
     * @param tenant 租户
     * @param type   状态枚举 - ACTIVE {@link MessageRepositoryModel.MessageRepositoryEnum#ACTIVE}
     * @return 消息清单
     */
    List<MessageRepositoryModel> list(Long limit, String tenant, MessageRepositoryModel.MessageRepositoryEnum type);
}
